問題解説 Docker 実技
解説
問題
DockerサーバとDockerレジストリサーバがあります。
Dockerサーバでdocker-composeでRedmineのサービスを立ち上げようとしたが、うまく起動しない・・・。
もう少しで立ち上がりそうだが、原因がわからないので修正し、VNCマシンからRedmineのページにアクセスできるようにしてください!
構成
ルータ[VyOS]
- eth0(192.168.0.1) — VNC操作マシン(192.168.0.254)
- eth1(172.16.0.1) — Dockerサーバ(172.16.0.2)
- eth2(172.17.0.1) — Dockerレジストリ(172.17.0.2)
トポロジ図
ログイン情報(ssh)
- VyOS: 操作不可
- Dockerサーバ:
- ID: root
- Pass: xxxxxx
- sshポート: 22
- Dockerレジストリ: 操作不可
条件:
- DockerRegistry上のDockerImageをコンテナとして使用すること
- Dockerサーバにあるdocker-compose.yml(変更不可)を用いてRedmineサービスを立ち上げること
- 必要に応じてDockerの設定を変更してかまわない
- VNCマシンのブラウザからredmineページが表示されること
回答方法:
- 「問題文」にて提示した条件が達成されているかで採点します。
- サーバの状況のみで採点を行います。
- 対応完了の報告は必要ありません。
解説
DockerでRedmineサービスを立ち上げる過程でのトラブルシューティングの問題です。
以下の問題を解決するとサービスが立ち上がります。
- ① DockerレジストリLANとDockerサーバのnic-docker0のIP帯重複の解消
- ② docker pullによるDockerイメージのダウンロードをhttp(80)にする(insecureオプション設定)
①
Dockerサーバにてdocker-compose up
等でredmineサービスを立ち上げようとするとエラーとなります。
docker-compose.ymlに記載されているDockerイメージを見ると
...
redmine:
image: docker-registry.local/redmine
...
イメージの取得元がdocker-registry.local
になっています。
名前解決すると172.17.0.2
で、これは/etc/hosts
に記載されています。
つまり172.17.0.2
のDockerレジストリからイメージを取得して使う意図が読み取れます。
しかしながらDockerサーバから172.17.0.2
にpingを実行すると応答がありません。
[root@docker-server ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
From 172.17.0.1 icmp_seq=1 Destination Host Unreachable
これはDockerが作成している仮想NIC(docker0)が172.17.0.1/16
であることが原因です。
Dockerレジストリ(172.17.0.2
)向けのパケットがdocker0
へルーティングされるため、正しくDockerレジストリと通信できません。
このため、docker0のIP帯を使用されていないプライベートIP帯に変更します。
変更する方法は複数ありますが、例として/etc/sysconfig/docker
のOPTION
に記述する方法を示します。
[root@docker-server ~]# cat /etc/sysconfig/docker
...
OPTIONS='--insecure-registry 172.17.0.2 --bip 192.168.100.1/24 --selinux-enabled --log-driver=journald --signature-verification=false'
...
OPTIONS
に--bip 192.168.100.1/24
を追加してdockerサービスを再起動します。
nicのdocker0
のIPが変更されたことを確認します。
[root@docker-server ~]# ip a
...
3: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:28:18:cc:19 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 scope global docker0
valid_lft forever preferred_lft forever
...
これでDockerレジストリ(172.17.0.2
)へ疎通が取れるようになりました。
[root@docker-server ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=63 time=1.19 ms
②
①のIP帯重複問題を解決後にdocker-compose up
を実行してもまだイメージをpullすることができません。
[root@docker-server ~]# docker-compose up
Pulling db (docker-registry.local/mariadb:)...
Trying to pull repository docker-registry.local/mariadb ...
ERROR: Get https://docker-registry.local/v1/_ping: dial tcp 172.17.0.2:443: getsockopt: no route to host
エラーを見ると172.17.0.2:443
に接続し、アクセスに失敗していることがわかります。
curl等で172.17.0.2:443
の状態を確認すると動作していません。
ここで、/etc/sysconfig/docker
の設定を見ると
[root@docker-server ~]# cat /etc/sysconfig/docker
...
OPTIONS='--insecure-registry 172.17.0.2 --bip 192.168.100.1/24 --selinux-enabled --log-driver=journald --signature-verification=false'
...
--insecure-registry 172.17.0.2
の記述があり、docker標準のhttps(443)
でアクセスさせずに、insecureアクセスであるポート80
で通信を行うという意図が確認できます。
一見DockerレジストリサーバIPが172.17.0.2
であるため、正しく設定できていそうですが、ここはホスト名を指定する必要があります。
docker-compose.yml
にはDockerレジストリをdocker-registry.local
と記載していたため、記述を合わせます。
最終的なetc/sysconfig/docker
は以下の通りです。
[root@docker-server ~]# cat /etc/sysconfig/docker
...
OPTIONS='--insecure-registry docker-registry.local --bip 192.168.100.1/24 --selinux-enabled --log-driver=journald --signature-verification=false'
...
再度Dockerサービスを再起動し、docker-compose up
をすることで、Redmineサービスが稼働し、完了となります。
講評
参加者の皆さん競技お疲れさまでした。Docker問題を出題させていただきました。
皆さんの回答結果ですが、満点のチームも多くDocker対策されているなという印象を受けました。
トラブル①
トラブル①のIP帯重複に関しては予選1でも出題された範囲になりますので、解けたチームも多かったのではないでしょうか。
Dockerを使う場合は172系のIP帯がデフォルトで使用されるため、プライベートIP帯との衝突が発生する場合があります。
原因の切り分けとしてサーバへIP層での疎通があるかどうかをしっかりと確認することが大切です。
トラブル②
トラブル②はDockerレジストリに関する問題です。
dockerイメージのpullはデフォルトでhttps通信となっています。
http通信にするためにはオプション指定が必要です。
Docker設定ファイルの/etc/sysconfig/docker
よりinsecure
オプションが設定されていることからDockerレジストリへ、http通信を行う意図が読み取れます。
しかし実際には、Dockerイメージpull時のエラーで443ポートで通信を行っていることが読み取れますので、Dockerレジストリへの接続設定を見直すことが必要です。
全体
今回は実務で経験したトラブルを基に作問しました。楽しんで解いていただけたのであれば幸いです。
今後もトラブルシューティングする楽しさを大切にして、多くの技術を学んでください。
本問題で採点ミスが発生し成績発表後に点数、順位が変更となったこと深くお詫び申し上げます。